// 和登录相关的路由
const express = require('express')
const router = express.Router()

// 引入adminModel
const adminModel = require('../db/models/model')

// 引入tokenManger
const tokenManger = require('../utils/token')

// 定义登录的接口
router.post('/login', async function (req, res) {
  // 获取用户上传的用户名和密码
  const { username, password } = req.fields
  console.log(username, password)
  // 去数据库中查找对应的数据
  // find返回所有符合条件的数据,是一个数组,即便没找到,返回的也是空数组
  // findOne返回的是符合条件的第一条数据,是一个对象,没有没有,返回一个null
  const admin = await adminModel.findOne({ username, password })
  if (admin) {
    // 说明有这条数据
    // 生成一个token
    //注意:mongodb数据库中的id叫做_id
    const token = tokenManger.encodeToken(admin._id)

    // 将token存储到当前登录用户的token字段中
    await adminModel.updateOne({ _id: admin._id }, { $set: { token } })

    // 响应浏览器,告诉浏览器登录成功,并且把token也响应给浏览器
    res.send({ status: 'ok', message: '登录成功', token, id: admin._id })
  } else {
    // 说明没有这条数据
    res.send({ status: 'fail', message: '用户名或密码输入错误' })
  }
})

// 定义退出登录的接口
router.post('/logout', async function (req, res) {
  // 接收退出登录的用户的id
  const { id } = req.fields
  // 删除当前登录用户的token(修改当前登录用户的token,改成'')
  await adminModel.updateOne({ _id: id }, { $set: { token: '' } })
  // 响应浏览器
  res.send({ status: 'ok', message: '退出成功' })
})

// 校验token的接口
router.post('/vertifyToken', async function (req, res) {
  // 从请求头中获取token
  const token = req.get('token')
  // 接收上传的id
  const { id } = req.fields
  // 如果浏览器上传token就是一个有内容的字符串,如果没有上传就是undefined
  if (token) {
    // 说明上传token,要继续判断数据中的token和当前token是否一致
    // 如果找到了是当前登录用户的信息对象,如果找不到就是null
    const admin = await adminModel.findOne({ _id: id, token })
    if (admin) {
      // 校验token的有效期
      // 解析token,拿到生成token的时间戳,和当前时间进行对比,如果超过30分钟,则认为登录超过,如果没有超过30分钟,则认为登录有效
      const result = tokenManger.decodeToken(token)
      // 半小时的毫秒值 1000 * 60 * 30
      const validTime = 1000 * 60 * 30
      if (Date.now() - result.expires < validTime) {
        // token有效
        res.send({ status: 'ok', message: '登录有效' })
      } else {
        // token无效
        res.send({ status: 'fail', message: '登录失效,请重新登录, token过期' })
      }
    } else {
      // 说明token不一致
      res.send({
        status: 'fail',
        message: '登录失效,请重新登录, token和数据库不一致',
      })
    }
  } else {
    // 说明没有上传token
    res.send({ status: 'fail', message: '登录失效,请重新登录.没有token' })
  }
})

module.exports = router
